package com.hifar.base.serialNo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hifar.base.serialNo.mapper.BaseSerialNoMapper;
import com.hifar.base.serialNo.pojo.BaseSerialNo;
import com.hifar.base.serialNo.service.IBaseSerialNoService;
import com.hifar.utils.ToolKit;
import com.tssk.kylx.fw.utils.lang.DateUtils;
import com.tssk.kylx.fw.utils.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Objects;

/**
 * @author zhuWeiWei
 * @description TODO
 * @date 2024/12/5 11:31
 */
@Service
public class BaseSerialNoServiceImpl extends ServiceImpl<BaseSerialNoMapper, BaseSerialNo> implements IBaseSerialNoService {


    @Override
    @Transactional(rollbackFor = Exception.class)
    public String getMouthSerialNo(String type, String pattern, String prefix, String suffix, int digitNum) {

        String dateType = DateUtils.formatTime(new Date(), pattern);

        QueryWrapper<BaseSerialNo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .eq(BaseSerialNo::getType, type)
                .eq(BaseSerialNo::getYearDay,dateType );
        BaseSerialNo baseSerialNo = this.getOne(queryWrapper);
        if (Objects.nonNull(baseSerialNo)) {
            Integer serialNo = baseSerialNo.getSerialNo();
            String no = ToolKit.supplementZero(StringUtils.trimNull(serialNo + 1), digitNum);
            baseSerialNo.setSerialNo(serialNo + 1);
            this.updateById(baseSerialNo);
            return String.format("%s%s%s%s", prefix, dateType, suffix, no);
        }
        baseSerialNo = new BaseSerialNo();
        baseSerialNo.setSerialNo(1);
        baseSerialNo.setType(type);
        baseSerialNo.setYearDay(dateType);
        String no = ToolKit.supplementZero(StringUtils.trimNull(1), digitNum);
        this.save(baseSerialNo);
        return String.format("%s%s%s%s", prefix, dateType, suffix, no);
    }

    @Override
    public String getSerialNo(String type, String prefix, String suffix, int digitNum) {
        String dateType = "__";
        QueryWrapper<BaseSerialNo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .eq(BaseSerialNo::getType, type)
                .eq(BaseSerialNo::getYearDay, dateType);
        BaseSerialNo baseSerialNo = this.getOne(queryWrapper);
        if (Objects.nonNull(baseSerialNo)) {
            Integer serialNo = baseSerialNo.getSerialNo();
            String no = ToolKit.supplementZero(StringUtils.trimNull(serialNo + 1), digitNum);
            baseSerialNo.setSerialNo(serialNo + 1);
            this.updateById(baseSerialNo);
            return String.format("%s%s%s", prefix, suffix, no);
        }
        baseSerialNo = new BaseSerialNo();
        baseSerialNo.setSerialNo(1);
        baseSerialNo.setType(type);
        baseSerialNo.setYearDay(dateType);
        String no = ToolKit.supplementZero(StringUtils.trimNull(1), digitNum);
        this.save(baseSerialNo);
        return String.format("%s%s%s", prefix, suffix, no);
    }
}
